// 要创建仓库实例
import { createStore } from "vuex";
import { INCREMENT2 } from "./mutations_type";

const store = createStore({
  // 仓库的state就是全局的数据，相当于组件的data
  state() {
    return {
      name: "xiaohua",
      count: 10,
      sex: 2,
      likes: ["买房", "旅游"],
      message: "hello vuex!",
      time: 1678085277207,
      age: 20,
    };
  },

  // getters相当于是仓库的计算属性
  getters: {
    timeStr(state, getters) {
      const date = new Date(state.time);
      const Y = date.getFullYear() + "-";
      const M =
        (date.getMonth() + 1 < 10
          ? "0" + (date.getMonth() + 1)
          : date.getMonth() + 1) + "-";
      const D =
        (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " ";
      const h =
        (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":";
      const m =
        (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) +
        ":";
      const s =
        date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
      return Y + M + D + h + m + s;
    },
    timeStr2(state, getters) {
      return getters.timeStr + "!!!";
    },
    // count2(state) {
    //   return state.count * 5;
    // },
    // 柯里化函数 curry
    count2: (state) => (n) => state.count * n,
  },

  // 是放函数的，mutations是唯一可以改变state的地方
  // 可以接受state作为参数
  mutations: {
    increment(state) {
      state.count++;
    },
    // 可以接受第二个参数payload(载荷),表示参数
    // 一般情况下payload建议写成对象的形式
    [INCREMENT2](state, payload) {
      // console.log(payload);
      state.count += payload.num;
    },
    addage(state) {
      // mutations必须是一个同步函数
      // 每一次调用mutation的函数的时候，在开发工具里面都会产生一条记录(快照)
      // 产生快照的时机是mutation函数调用的时间，而不是数据在改变的时候
      // 会让开发工具里面的快照的值有错误
      // setTimeout(() => {
      state.age++;
      // }, 2000);
    },

    syncAgeAdd(state, payload) {
      state.age += payload.n;
    },
  },

  // actions里面是可以写异步函数的
  // actions是不能直接修改state的，只能去调用mutations的函数
  actions: {
    asyncAgeAdd({ commit }, payload) {
      setTimeout(() => {
        // console.log(context);
        // context.commit("syncAgeAdd");
        commit("syncAgeAdd", payload);
      }, 1000);
    },
  },
});

export default store;
